package com.chapter6;

import java.util.ArrayList;
import java.util.List;

public class MultiDimensionalArrays {

	void printSpiralMatrix(int[][] A){
		int R = A.length;
		int C=A[0].length;
		int tl=0;
		int tr=0;
		int br=C-1;
		int bl=R-1;
		while(tl<=br || tr<=bl){
			for(int i=tl;i<=br;i++)
				System.out.println(A[tr][i]);
			tr++;
			if(!(tl<=br && tr<=bl))
				break;
			for(int i=tr;i<=bl;i++)
				System.out.println(A[i][br]);
			br--;
			if(!(tl<=br && tr<=bl))
				break;
			for(int i=br;i>=tl;i--)
				System.out.println(A[bl][i]);
			bl--;
			if(!(tl<=br && tr<=bl))
				break;
			for(int i=bl;i>=tr;i--)
				System.out.println(A[i][tl]);
			tl++;
			if(!(tl<=br && tr<=bl))
				break;
		}
		
	}
	
	public boolean rotateSquareArray(int[][] A){
		int row=A.length;
		int col=A[0].length;
		if(col!=row)return false;
		for(int depth=0;depth<col/2;depth++){
			for(int i=depth;i<col-1-depth;i++){
				int temp1=A[depth][i];
				int temp2=A[i][col-1-depth];
				int temp3=A[col-1-depth][col-1-i];
				int temp4=A[col-1-i][depth];
				A[i][col-1-depth]=temp1;
				A[col-1-depth][col-1-i]=temp2;
				A[col-1-i][depth]=temp3;
				A[depth][i]=temp4;
			}
		}
	return true;
	}
	
	public void printPascalsTriangle(int rows){
		if(rows<0)
			return;
		List<Integer> prev=new ArrayList<Integer>();
		prev.add(1);
		System.out.println(prev);
		int j,i;
		for(i=1;i<rows;i++){
			List<Integer>curr=new ArrayList<Integer>();
			curr.add(prev.get(0));
			
			for(j=1;j<prev.size();j++){
				curr.add(prev.get(j-1)+prev.get(j));
			}
			curr.add(prev.get(j-1));
			System.out.println(curr);
			prev=curr;
		}
	}
	
	public void setZeros(int[][] A){
		int[] rows=new int[A.length];
		int[] cols=new int[A[0].length];
		
		for(int i=0;i<A.length;i++){
			for(int j=0;j<A[0].length;j++){
				if(A[i][j]==0){
					rows[i]=1;
					cols[j]=1;
				}
			}
		}
		for(int i=0;i<A.length;i++){
			for(int j=0;j<A[0].length;j++){
				if(rows[i]==1 || cols[j]==1){
					A[i][j]=0;
				}
			}
		}
	}
	
	public int findCelebrity(int[][] A){
		int size=A.length;
		int i,j,k = 0;
		for(i=0;i<size;i++){
			for(j=0;j<size;j++){
				if(A[j][i]!=1)break;
			}
			if(j==size){
				for(k=0;k<size;k++){
					if(k==i)continue;
					if(A[i][k]!=0)break;
				}
				if(k==size)return i;
			}
		}
		return -1;
	}
}